/* 
 * File:   ProcesoAutenticacion.h
 * Author: maximiliano
 *
 * Created on 7 de junio de 2013, 18:50
 */

#ifndef PROCESOAUTENTICACION_H
#define	PROCESOAUTENTICACION_H

#include <queue>
#include "server_Proceso.h"
#include "server_IAutenticacionManejadorEvento.h"
#include "server_IManejadorConexionEvento.h"
#include "server_UsersDB.h"
#include "common_Mutex.h"
#include "common_ProtocoloConstantes.h"

using namespace std;
using namespace TP;
using namespace TP::Procesos::Eventos;
using namespace TP::Comunicacion::Eventos;

namespace TP { namespace Procesos {

class ProcesoAutenticacion : public Proceso, public IManejadorConexionEvento {

public:

    ProcesoAutenticacion(const uint32_t &pId, IAutenticacionManejadorEvento* pManejadorEvento, const string& pUsuariosDBRutaARchivo);
    
    virtual ~ProcesoAutenticacion();
    
    virtual void eventoNuevaSesion (IEnviante* pEnviante, void* pArg);

    virtual void eventoErrorConexionInexistente (IEnviante* pEnviante, const string& pMensaje);
    
    virtual void Iniciar() throw (Excepcion&);

    virtual void Finalizar() throw (Excepcion&);  

    UsersDB* GetBaseDatosUsuarios();
    
protected:
    
    virtual void tarea();
    
private:
    
    Sesion* PopSesion ();
    
    Sesion* PushSesion(Sesion* pSesion);
    
    void DescartarSesiones();
    
    string ConstruirRespuestaAutenticacion(const string &pResultadoAutenticacion, const string &pUsuario, const string& pMensaje );

    void GetCredencial (string & pUsuario, string & pContrasenia, Sesion* pSesion);
    
    IAutenticacionManejadorEvento* _autenticacionManejadorEvento;
    string _usuariosDBRutaARchivo;
    UsersDB* _usuariosDB;
    queue <Sesion*> _sesiones;
    Mutex _sesionesMutex;
};

}}

#endif	/* PROCESOAUTENTICACION_H */

